#include<iostream>
#include<opencv2/opencv.hpp>

#include "../Camera/FightingCapture.h"

#include "../Camera/FightingDahengCapture.h"

#ifndef CALIBRATOR_H
#define CALIBRATOR_H

namespace fytVision{
class Calibrator
{
public:
    Calibrator():
    is_calibrated(false),
    camera_mat(cv::Mat(3,3,CV_32FC1,cv::Scalar::all(0))),
    coeffs(cv::Mat(1,5,CV_32FC1,cv::Scalar::all(0)))
    {}

/*********************
 * @brief 初始化标定器
 * @param chessboards_   棋盘图像
 * @param img_size_     图片大小
 * @param board_size_   棋盘大小
 * @param block_size_   单位格子大小
 * @return 初始化成功标志
*/
    bool Init(std::vector<cv::Mat>& chessboards_,const cv::Size &img_size_,const cv::Size &board_size_,const cv::Size2f &block_size_);

/*********************
 * @brief 标定主程序，需先初始化
 * @return 标定成功标志
*/
    bool Run();

/*********************
 * @brief 得到标定后的矩阵
 * @param 矩阵数组，顺序为内参、畸变
 * @return 成功标志
*/
    bool GetMats(std::vector<cv::Mat>& mats);

private:
    cv::Mat camera_mat; //内参矩阵
    std::vector<cv::Mat> rvecs;//旋转向量
    std::vector<cv::Mat> tvecs; //平移向量
    cv::Mat coeffs; //畸变矩阵
    bool is_calibrated;
    std::vector<cv::Mat> chess_boards; //棋盘图片 
    cv::Size img_size; //图片大小
    cv::Size2f block_size; //单位格子大小
    cv::Size board_size; //棋盘大小 行数x列数
};
}

#endif //CALIBRATOR_H